#ifndef __LINKTREE_H_
#define __LINKTREE_H_

#define ElementType void* 
//因为插入位置有多种，所以通过两个类来实现
class Node
{
public:
    Node(ElementType element);      //创建节点，写成构造函数
    void Connect(Node * parent);    //将当前节点连接到parent节点上
    void DisConnect();//不需要参数
    //调用静态函数简单一些，用来遍历节点
    static void TravelNode(Node * node, int depth,void(*showPtr)(ElementType)); //为啥静态，加深度
    
    
    void show();
/* 找文件夹路径 */
    /* 获取父节点 */
    Node * GetParent()const;
    /* 获取data */ 
    ElementType GetData();
    
    
    
    
    
    friend class LinkTree;//耦合度很高,用友元调用LinkTree中的变量

private:
    ElementType data;   //节点的数据域
    Node * parent;      //双亲指针
    Node * nextSibling; //下一个兄弟节点
    Node * firstChild;  //第一个孩子节点
    
};

class LinkTree
{
public:
    LinkTree();
    ~LinkTree();
    /* 获取根节点 */
    Node * GetRoot()const;  //const修饰成员函数，代表成员变量不能被修改
    void show();
    Node * FindNode(ElementType element);
    
 /* 常用接口调用 */
    /* 调用获得树的高度*/
    int GetTreeHeight();
    
    void SetShowtype(void(*showPtr)(ElementType));  //不能放在节点里面，要放在树里面

    /* 调用函数 */
    void SetFindType(bool (*IsEqual)(ElementType,ElementType));
    
private:
    void FreeNode(Node * node);

/* ………………常用接口……………… */
    /* 获取树的高度 */
    int GetNodeHeight(Node * node);  
    /* 查找节点 */
    Node * FindNode(Node * node,ElementType element);   //返回node节点

/* ………………回调函数……………… */
    void (*showPtr)(ElementType);    //加void*之后传一个函数指针
    /* 判断是否相等 */
    bool (*IsEqualPtr)(ElementType,ElementType);
    
    Node * root;    //根节点（不存放数据，虚假指针）
    
};

#endif